Skip to content

fix(security): PAT org binding, subscribe throttle, invite lookup, SNMP secret - #699

Merged
fclairamb merged 21 commits into
mainfrom
security/scan-specs-2026-10-28
Oct 28, 2026
Merged

fclairamb merged 21 commits into
mainfrom
security/scan-specs-2026-10-28

Conversation

@fclairamb

@fclairamb fclairamb commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

Security fixes from the daily security scans (specs filed in this PR, now implemented).

What changed

  • X1 (high): a personal access token is bound to one org. It can no longer call switch-org, mint sessions or device-consent tokens, or change sign-in factors (password, 2FA, passkeys, email). It gets 403 PAT_FORBIDDEN. sp auth switch-org on a PAT login explains what to do. Registering a passkey now emails the owner.
  • X2 (medium): status-page subscribe no longer un-confirms a confirmed subscriber. Confirm emails are budgeted (3 per recipient, 100 per page, 20 per IP per hour, configurable via SP_STATUS_SUBSCRIBERS_CONFIRM_PER_*_PER_HOUR). Unconfirmed rows expire after 7 days (new column confirm_sent_at in migration 031).
  • X3 (medium): invite-token lookup is one keyed lookup, not a scan of every organization. Breaking: invitations created before this release are no longer found; admins must re-send them.
  • X4 (low): the SNMP community string is stored as a secret and no longer returned by the API or exports.
  • Batch gate: fixed the env-var docs accessors for the new subscribe budgets. Full Go suite, lint and Playwright (980 passed) green.

Decided by autopilot

  • X1, PAT calling switch-org: not allowed at all (recommended answer).
  • X1, DELETE /auth/2fa keeps sharing the login budget (recommended answer).
  • X2, budgets 3 / 100 / 20 per hour as config values (recommended answer).
  • X3, no fallback for pre-upgrade invites; noted in the commit for the changelog (recommended answer).

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fclairamb and others added 5 commits October 28, 2026 07:24
…gn-in factor

A personal access token could call switch-org to get a full session in
any org of its owner, approve a device grant for another org, and add
sign-in factors (passkey, password, 2FA). RequireAuth now refuses those
routes to a PAT with 403 PAT_FORBIDDEN, startSession refuses to mint a
session from a PAT request, and registering a passkey emails the owner.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@codecov

codecov Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 91.70306% with 19 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.74%. Comparing base (ea540e8) to head (a1bd9dc).

Files with missing lines Patch % Lines
...ver/internal/handlers/statussubscribers/service.go 89.55% 7 Missing ⚠️
server/internal/handlers/auth/service.go 81.25% 6 Missing ⚠️
server/internal/handlers/auth/device_handler.go 0.00% 2 Missing ⚠️
...erver/internal/db/models/status_page_subscriber.go 83.33% 1 Missing ⚠️
...ver/internal/db/postgres/status_page_subscriber.go 92.85% 1 Missing ⚠️
...erver/internal/db/sqlite/status_page_subscriber.go 92.85% 1 Missing ⚠️
server/internal/handlers/auth/handler.go 66.66% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #699      +/-   ##
==========================================
+ Coverage   89.72%   89.74%   +0.01%     
==========================================
  Files        1292     1295       +3     
  Lines      131787   131964     +177     
==========================================
+ Hits       118247   118432     +185     
+ Misses      13531    13523       -8     
  Partials        9        9              
Files with missing lines Coverage Δ
server/internal/app/server.go 92.02% <100.00%> (+<0.01%) ⬆️
...nternal/checkers/checksnmp/config/secret_fields.go 100.00% <100.00%> (ø)
server/internal/config/config.go 94.00% <100.00%> (+0.01%) ⬆️
server/internal/config/envvars.go 100.00% <100.00%> (ø)
server/internal/config/status_subscribers.go 100.00% <100.00%> (ø)
server/internal/email/supportreply.go 92.68% <ø> (ø)
server/internal/handlers/auth/device_service.go 90.17% <100.00%> (+0.11%) ⬆️
server/internal/handlers/auth/email_change.go 89.18% <100.00%> (+0.14%) ⬆️
server/internal/handlers/auth/join_policy.go 87.38% <100.00%> (+0.63%) ⬆️
server/internal/handlers/auth/passkey_notice.go 100.00% <100.00%> (ø)
... and 16 more

... and 26 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

fclairamb and others added 15 commits October 28, 2026 07:50
…llow the PAT binding

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the owner's other orgs and add sign-in factors

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ry and confirm-mail budget config

status_page_subscriber.confirm_sent_at records when the current confirm
token was issued; DeleteExpiredUnconfirmedSubscribers reaps never-confirmed
rows past it. SP_STATUS_SUBSCRIBERS_CONFIRM_PER_{RECIPIENT,PAGE,IP}_PER_HOUR
budget the double opt-in mail (defaults 3, 100, 20).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…bscribers confirmed

The public subscribe endpoint no longer mails on every call: the confirm
mail is budgeted per recipient (all pages), per page and per trusted client
IP, and a live confirmed subscription is left untouched by a repeat
subscribe. Both cases still answer 202 pending_confirmation, so the
endpoint reveals nothing. Confirm links expire after 7 days and the
state-cleanup job reaps the unconfirmed rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…kup out of Subscribe

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rottled confirm emails and un-confirms existing subscribers

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rg scan

The public GET /auth/invite/:token and anonymous POST /auth/accept-invite
loaded every organization and probed two state entries per org, so an
unknown token cost about 2 x N + 1 queries. CreateInvitation now also
writes a global index entry (invite:<hash>, no organization, value
{orgUID}); findInvite reads it, then the org-scoped entry. Acceptance,
federated join and revocation delete both. The legacy plaintext-key branch
(TODO remove after 2026-10-10) is gone.

Operator action: invitations created before this release have no index
entry and are no longer found; admins must re-send them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s every organization

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Declare community in SNMPConfig.SecretFields so it is encrypted, redacted
from GET/export/snapshots, and rendered as a password input in dash0.
credmigrate.RunPlaintext runs at every startup and re-splits rows whose
private column is empty, so existing v1/v2c rows move automatically; past
version snapshots are scrubbed on read via HiddenConfigKeys.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…urned as public check config

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@fclairamb fclairamb changed the title chore(specs): security scan findings fix(security): PAT org binding, subscribe throttle, invite lookup, SNMP secret Oct 28, 2026
@fclairamb
fclairamb merged commit cdf59bb into main Oct 28, 2026
35 checks passed
@fclairamb
fclairamb deleted the security/scan-specs-2026-10-28 branch October 28, 2026 08:32
fclairamb added a commit that referenced this pull request Oct 29, 2026
…eport screenshots (#708)

Fixes the findings of the daily security scans. Each spec is the tracker
for its finding.

## Fixed by this PR

- **Y1 (low)**:
`specs/done/2026/10/2026-10-29-01-bug-report-upload-instance-budget.md`.
Anonymous bug-report screenshots are capped at 100 MB per org, but the
caller picks the org, so the instance-wide total is 100 MB times the
number of orgs. Screenshots are also stored past the issue-dispatch cap
and never deleted. The fix adds an instance-wide budget for anonymous
screenshots, reserves the dispatch slot before storing, makes the quota
atomic and adds a retention.

## Earlier scan specs (implemented, in `specs/done/2026/10/`)

- **X1 (high)**:
`2026-10-28-01-pat-cannot-mint-sessions-or-sign-in-factors.md`. A PAT
could open sessions in its owner's other orgs and add sign-in factors.
Fixed in #699.
- **X2 (medium)**:
`2026-10-28-02-status-subscribe-throttle-and-keep-confirmed.md`.
Unthrottled subscribe confirm emails, and re-subscribing un-confirmed a
subscriber. Fixed in #699.
- **X3 (medium on SaaS)**:
`2026-10-28-03-invite-lookup-without-org-scan.md`. Invite lookup scanned
every org. Fixed in #699.
- **X4 (low)**: `2026-10-28-04-snmp-community-secret-field.md`. The SNMP
community was not a secret field. Fixed in #699.
- **V1 (medium)**: `2026-10-27-01-device-consent-phishing-guard.md`.
Device-flow consent phishing. Fixed in #693.
- **W1 (low)**: `2026-10-27-02-disable-2fa-attempt-throttle.md`. `DELETE
/auth/2fa` had no attempt budget. Fixed in #693.
- **U1 (low)**:
`2026-10-26-02-ai-repair-hold-skips-param-only-secrets.md`. The `repair:
auto` hold applied only when the check's `secrets` map had a value.
Fixed in #683.
- **S1 (medium)**:
`2026-10-25-01-ai-repair-grant-dropped-by-reference-resolution.md`. The
repair grant was compared after `${…}` references were resolved. Fixed
in #678; U1 closed the remaining gap.
- **R1 (medium)**:
`2026-10-24-01-ai-repair-auto-apply-partial-runtime-host.md`. `repair:
auto` applied a candidate that kept a literal host and added one built
at runtime. Fixed in #663.
- **Q1 (medium)**:
`2026-10-23-02-ai-loop-secret-relay-through-model.md`. AI loops relayed
an encoded secret through the model.
- **P1 (medium)**:
`2026-10-22-01-ai-script-secret-host-guard-runtime.md`. AI runs with
real secrets were only host-checked by regex.
- **K1 (medium)**: `2026-10-20-01-sender-response-body-caps.md`.
Notification senders and RabbitMQ read responses uncapped.
- **J1 (medium)**: `2026-10-19-01-a2a-response-size-cap.md`. A2A
responses were read uncapped.
- **I1 (low)**: `2026-10-18-01-plugin-schema-file-ref.md`. Plugin schema
`$ref` could load local files.
- **G1/G2 (low)**: `2026-10-17-01-postgres-check-connection-config.md`.
Postgres conninfo escaping and fallback to the worker's `PG*` env.
- **F1**: `2026-10-16-15-pat-cache-revocation.md`. The PAT cache
outlived revocation.
- **E1**: `2026-10-16-14-totp-on-federated-sign-in.md`. No TOTP on
federated sign-in.
- **E2**: `2026-10-16-13-atomic-auth-attempt-counters.md`. Auth attempt
counters were not atomic.
- **H3**: `2026-10-16-12-mcp-tokens-rejected-on-rest.md`. MCP OAuth
tokens worked on REST.
- **H2**: `2026-10-16-11-slack-signature-fail-closed.md`. Slack
signature check failed open.
- **T1 / M2 (high)**: `2026-10-16-10-discovery-scans-egress-guard.md`.
Discovery scans were outside the egress policy.
- **N4**: `2026-10-16-09-js-check-nested-docker-guard.md`. A JS `docker`
sub-check bypassed the gate.
- **N3 (high)**: `2026-10-16-08-status-page-components-cross-org.md`.
Status-page components could be edited across orgs.
- **D2/D3 (high)**:
`2026-10-16-07-guard-status-subscriber-and-publication-webhooks.md`.
Subscriber and publication webhooks were not guarded.
- **C3**: `2026-10-16-06-accept-invite-existing-account.md`. Accepting
an invite logged in as an existing account.
- **C1**: `2026-10-16-05-kubeconfig-exec-and-incluster.md`. Kubeconfig
`exec` and `inCluster` were allowed.
- **N2**: `2026-10-16-04-mysql-dsn-injection.md`. MySQL DSN injection.
- **N1**: `2026-10-16-03-env-secret-reference-allowlist.md`. No
allowlist for `${env:}` references.
- **C2/H1**: `2026-10-16-02-token-purpose-separation.md`. Purpose tokens
were accepted as access tokens.
- **D1**: `2026-10-16-01-microsoft-signin-unverified-email-linking.md`.
Microsoft nOAuth email linking.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
fclairamb added a commit that referenced this pull request Oct 30, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.42.1](v0.42.0...v0.42.1)
(2026-10-30)


### Bug Fixes

* **checkicmp:** socket-open failure is an infrastructure error
([#712](#712))
([208ff0a](208ff0a))
* **dash0:** explain chart Full range switch and status page visibility
hint ([#702](#702))
([9c6141b](9c6141b))
* **deps:** update github.com/dop251/goja digest to 5f913d1
([#697](#697))
([146cb22](146cb22))
* **deps:** update github.com/dop251/goja digest to 85be141
([#706](#706))
([c6abd8e](c6abd8e))
* **deps:** update github.com/dop251/goja digest to d535508
([#696](#696))
([7529c15](7529c15))
* **deps:** update github.com/dop251/goja digest to f818168
([#709](#709))
([7d03f42](7d03f42))
* **deps:** update go dependencies (non-major)
([#690](#690))
([6de8ac7](6de8ac7))
* **deps:** update go dependencies (non-major)
([#694](#694))
([0838916](0838916))
* **deps:** update go dependencies (non-major)
([#698](#698))
([ea540e8](ea540e8))
* **deps:** update go dependencies (non-major) to v0.37.2
([#704](#704))
([67da7f7](67da7f7))
* **deps:** update module github.com/posthog/posthog-go to v1.39.0
([#711](#711))
([b2a7f2c](b2a7f2c))
* **deps:** update module github.com/prometheus/common to v0.73.0
([#703](#703))
([1ac4dc8](1ac4dc8))
* **deps:** update module github.com/slack-go/slack to v0.32.0
([#707](#707))
([74db3d2](74db3d2))
* ICMP capability for workers, escalation targets on events, login bug
report and degraded incident fixes
([#701](#701))
([9613f98](9613f98))
* **security:** device consent phishing guard and 2FA disable throttle
([#693](#693))
([822186f](822186f))
* **security:** instance-wide budget and retention for anonymous
bug-report screenshots
([#708](#708))
([2be7787](2be7787))
* **security:** PAT org binding, subscribe throttle, invite lookup, SNMP
secret ([#699](#699))
([cdf59bb](cdf59bb))
* **security:** scope on-call override deletion to its schedule and org
([#714](#714))
([6708f03](6708f03))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
fclairamb added a commit that referenced this pull request Oct 30, 2026
…rawl reports (#715)

Specs filed from the daily security scans. Each spec is the tracker for
its finding. This PR files the specs and implements Z1 and Z2.

## Implemented by this PR (specs archived in `specs/done/2026/10/`)

- **Z1 (low)**:
`specs/todos/2026-10-30-02-bug-report-authenticated-org-membership.md`.
Y1 residual. The screenshot budget added in #708 applies only to
anonymous reports. A signed-in user who is not a member of the named org
bypasses it and stores screenshots in any org. The fix treats a
non-member's report like an anonymous one.
- **Z2 (low)**:
`specs/todos/2026-10-30-03-report-retention-spares-crawl-reports.md`.
The bug-report retention sweep added in #708 matches the whole `reports`
storage group, so it also deletes website crawl reports older than 90
days. The same group also makes crawl reports count against the
bug-report quota. The fix restricts both to topic-less files.

## Earlier scan specs (implemented, in `specs/done/2026/10/`)

- **Y1 (low)**: `2026-10-29-01-bug-report-upload-instance-budget.md`.
Anonymous bug-report screenshots were capped per org, not per instance,
and never deleted. Fixed in #708; Z1 and Z2 are follow-ups.
- **X1 (high)**:
`2026-10-28-01-pat-cannot-mint-sessions-or-sign-in-factors.md`. A PAT
could open sessions in its owner's other orgs and add sign-in factors.
Fixed in #699.
- **X2 (medium)**:
`2026-10-28-02-status-subscribe-throttle-and-keep-confirmed.md`.
Unthrottled subscribe confirm emails, and re-subscribing un-confirmed a
subscriber. Fixed in #699.
- **X3 (medium on SaaS)**:
`2026-10-28-03-invite-lookup-without-org-scan.md`. Invite lookup scanned
every org. Fixed in #699.
- **X4 (low)**: `2026-10-28-04-snmp-community-secret-field.md`. The SNMP
community was not a secret field. Fixed in #699.
- **V1 (medium)**: `2026-10-27-01-device-consent-phishing-guard.md`.
Device-flow consent phishing. Fixed in #693.
- **W1 (low)**: `2026-10-27-02-disable-2fa-attempt-throttle.md`. `DELETE
/auth/2fa` had no attempt budget. Fixed in #693.
- **U1 (low)**:
`2026-10-26-02-ai-repair-hold-skips-param-only-secrets.md`. The `repair:
auto` hold applied only when the check's `secrets` map had a value.
Fixed in #683.
- **S1 (medium)**:
`2026-10-25-01-ai-repair-grant-dropped-by-reference-resolution.md`. The
repair grant was compared after `${…}` references were resolved. Fixed
in #678; U1 closed the remaining gap.
- **R1 (medium)**:
`2026-10-24-01-ai-repair-auto-apply-partial-runtime-host.md`. `repair:
auto` applied a candidate that kept a literal host and added one built
at runtime. Fixed in #663.
- **Q1 (medium)**:
`2026-10-23-02-ai-loop-secret-relay-through-model.md`. AI loops relayed
an encoded secret through the model.
- **P1 (medium)**:
`2026-10-22-01-ai-script-secret-host-guard-runtime.md`. AI runs with
real secrets were only host-checked by regex.
- **K1 (medium)**: `2026-10-20-01-sender-response-body-caps.md`.
Notification senders and RabbitMQ read responses uncapped.
- **J1 (medium)**: `2026-10-19-01-a2a-response-size-cap.md`. A2A
responses were read uncapped.
- **I1 (low)**: `2026-10-18-01-plugin-schema-file-ref.md`. Plugin schema
`$ref` could load local files.
- **G1/G2 (low)**: `2026-10-17-01-postgres-check-connection-config.md`.
Postgres conninfo escaping and fallback to the worker's `PG*` env.
- **F1**: `2026-10-16-15-pat-cache-revocation.md`. The PAT cache
outlived revocation.
- **E1**: `2026-10-16-14-totp-on-federated-sign-in.md`. No TOTP on
federated sign-in.
- **E2**: `2026-10-16-13-atomic-auth-attempt-counters.md`. Auth attempt
counters were not atomic.
- **H3**: `2026-10-16-12-mcp-tokens-rejected-on-rest.md`. MCP OAuth
tokens worked on REST.
- **H2**: `2026-10-16-11-slack-signature-fail-closed.md`. Slack
signature check failed open.
- **T1 / M2 (high)**: `2026-10-16-10-discovery-scans-egress-guard.md`.
Discovery scans were outside the egress policy.
- **N4**: `2026-10-16-09-js-check-nested-docker-guard.md`. A JS `docker`
sub-check bypassed the gate.
- **N3 (high)**: `2026-10-16-08-status-page-components-cross-org.md`.
Status-page components could be edited across orgs.
- **D2/D3 (high)**:
`2026-10-16-07-guard-status-subscriber-and-publication-webhooks.md`.
Subscriber and publication webhooks were not guarded.
- **C3**: `2026-10-16-06-accept-invite-existing-account.md`. Accepting
an invite logged in as an existing account.
- **C1**: `2026-10-16-05-kubeconfig-exec-and-incluster.md`. Kubeconfig
`exec` and `inCluster` were allowed.
- **N2**: `2026-10-16-04-mysql-dsn-injection.md`. MySQL DSN injection.
- **N1**: `2026-10-16-03-env-secret-reference-allowlist.md`. No
allowlist for `${env:}` references.
- **C2/H1**: `2026-10-16-02-token-purpose-separation.md`. Purpose tokens
were accepted as access tokens.
- **D1**: `2026-10-16-01-microsoft-signin-unverified-email-linking.md`.
Microsoft nOAuth email linking.

## What changed

- **Z1**: a signed-in user who is not a member of the named org (and not
a super admin) now spends the anonymous screenshot budget and needs a
dispatch slot. Text-only reports still go through.
- **Z2**: `ListFilesByGroup` and `SumFileSizeByGroup` only match
topic-less files, so retention no longer purges crawl reports and they
no longer use the screenshot quota.

## Decided by autopilot

- Z1 spec, open question (refuse a non-member with 403, or treat as
anonymous?): treat as anonymous (recommended answer).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
fclairamb added a commit that referenced this pull request Oct 31, 2026
…-in factors (#728)

## What changed

- **AA1 (medium)**: a JS check now has a 64 MiB per-run memory budget on
the native builtins that allocate in one call (`repeat`, `padStart/End`,
`join`, `Array(n)`, `ArrayBuffer` and typed arrays, `fill`,
`Array.from`, and the length-driven `sort`, `toSorted`, `map`, `with`,
`toReversed`, `toSpliced`). A refused call throws a `RangeError` and the
worker keeps running. Spec:
`specs/done/2026/10/2026-10-31-01-js-checker-memory-budget.md`.
- **AA2 (low)**: turning on TOTP, registering a passkey and setting a
first password now need the current password (or, without one, a sign-in
within 10 minutes). `2fa/confirm` requires a `setupToken`, and a
`totp-enabled` notice email is sent. dash0 asks for the password first.
Spec:
`specs/done/2026/10/2026-10-31-02-sign-in-factor-enrollment-reauth.md`.

**Breaking API change**: `2fa/setup` and `passkeys/register/begin`
refuse a request without `currentPassword` on accounts with a password;
`2fa/confirm` needs `setupToken`. Sessions issued before this have no
sign-in time, so passwordless accounts must sign in again once.

Known gaps (not covered): string `+` doubling, `replaceAll`,
`JSON.stringify` and `TextEncoder` can still amplify; the long-term fix
is process isolation of check workers (separate spec).

## Earlier scan specs (implemented, in `specs/done/2026/10/`)

- **Z1 (low)**:
`2026-10-30-02-bug-report-authenticated-org-membership.md`. Signed-in
non-members skipped the bug-report screenshot budget. Fixed in #715.
- **Z2 (low)**:
`2026-10-30-03-report-retention-spares-crawl-reports.md`. The report
retention sweep also deleted website crawl reports. Fixed in #715.
- **Y1 (low)**: `2026-10-29-01-bug-report-upload-instance-budget.md`.
Anonymous bug-report screenshots were capped per org, not per instance,
and never deleted. Fixed in #708; Z1 and Z2 are follow-ups.
- **X1 (high)**:
`2026-10-28-01-pat-cannot-mint-sessions-or-sign-in-factors.md`. A PAT
could open sessions in its owner's other orgs and add sign-in factors.
Fixed in #699.
- **X2 (medium)**:
`2026-10-28-02-status-subscribe-throttle-and-keep-confirmed.md`.
Unthrottled subscribe confirm emails, and re-subscribing un-confirmed a
subscriber. Fixed in #699.
- **X3 (medium on SaaS)**:
`2026-10-28-03-invite-lookup-without-org-scan.md`. Invite lookup scanned
every org. Fixed in #699.
- **X4 (low)**: `2026-10-28-04-snmp-community-secret-field.md`. The SNMP
community was not a secret field. Fixed in #699.
- **V1 (medium)**: `2026-10-27-01-device-consent-phishing-guard.md`.
Device-flow consent phishing. Fixed in #693.
- **W1 (low)**: `2026-10-27-02-disable-2fa-attempt-throttle.md`. `DELETE
/auth/2fa` had no attempt budget. Fixed in #693.
- **U1 (low)**:
`2026-10-26-02-ai-repair-hold-skips-param-only-secrets.md`. The `repair:
auto` hold applied only when the check's `secrets` map had a value.
Fixed in #683.
- **S1 (medium)**:
`2026-10-25-01-ai-repair-grant-dropped-by-reference-resolution.md`. The
repair grant was compared after `${…}` references were resolved. Fixed
in #678; U1 closed the remaining gap.
- **R1 (medium)**:
`2026-10-24-01-ai-repair-auto-apply-partial-runtime-host.md`. `repair:
auto` applied a candidate that kept a literal host and added one built
at runtime. Fixed in #663.
- **Q1 (medium)**:
`2026-10-23-02-ai-loop-secret-relay-through-model.md`. AI loops relayed
an encoded secret through the model.
- **P1 (medium)**:
`2026-10-22-01-ai-script-secret-host-guard-runtime.md`. AI runs with
real secrets were only host-checked by regex.
- **K1 (medium)**: `2026-10-20-01-sender-response-body-caps.md`.
Notification senders and RabbitMQ read responses uncapped.
- **J1 (medium)**: `2026-10-19-01-a2a-response-size-cap.md`. A2A
responses were read uncapped.
- **I1 (low)**: `2026-10-18-01-plugin-schema-file-ref.md`. Plugin schema
`$ref` could load local files.
- **G1/G2 (low)**: `2026-10-17-01-postgres-check-connection-config.md`.
Postgres conninfo escaping and fallback to the worker's `PG*` env.
- **F1**: `2026-10-16-15-pat-cache-revocation.md`. The PAT cache
outlived revocation.
- **E1**: `2026-10-16-14-totp-on-federated-sign-in.md`. No TOTP on
federated sign-in.
- **E2**: `2026-10-16-13-atomic-auth-attempt-counters.md`. Auth attempt
counters were not atomic.
- **H3**: `2026-10-16-12-mcp-tokens-rejected-on-rest.md`. MCP OAuth
tokens worked on REST.
- **H2**: `2026-10-16-11-slack-signature-fail-closed.md`. Slack
signature check failed open.
- **T1 / M2 (high)**: `2026-10-16-10-discovery-scans-egress-guard.md`.
Discovery scans were outside the egress policy.
- **N4**: `2026-10-16-09-js-check-nested-docker-guard.md`. A JS `docker`
sub-check bypassed the gate.
- **N3 (high)**: `2026-10-16-08-status-page-components-cross-org.md`.
Status-page components could be edited across orgs.
- **D2/D3 (high)**:
`2026-10-16-07-guard-status-subscriber-and-publication-webhooks.md`.
Subscriber and publication webhooks were not guarded.
- **C3**: `2026-10-16-06-accept-invite-existing-account.md`. Accepting
an invite logged in as an existing account.
- **C1**: `2026-10-16-05-kubeconfig-exec-and-incluster.md`. Kubeconfig
`exec` and `inCluster` were allowed.
- **N2**: `2026-10-16-04-mysql-dsn-injection.md`. MySQL DSN injection.
- **N1**: `2026-10-16-03-env-secret-reference-allowlist.md`. No
allowlist for `${env:}` references.
- **C2/H1**: `2026-10-16-02-token-purpose-separation.md`. Purpose tokens
were accepted as access tokens.
- **D1**: `2026-10-16-01-microsoft-signin-unverified-email-linking.md`.
Microsoft nOAuth email linking.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant